package controlador;

import java.util.ArrayList;
import java.util.List;

import model.CursoPeriodo;
import daos.CursoPeriodoDAO;
import daosimpl.CursoPeriodoDAOImplH;
import util.HibernateUtil;
import daos.AlumnoDAO;
import daos.CursoDAO;
import daos.EvaluacionDAO;
import daos.ExamenDAO;
import daos.MatriculaDAO;
import daos.PeriodoDAO;
import daos.PermisoDAO;
import daos.PreguntaDAO;
import daos.PreguntaEstadoDAO;
import daos.ProfesorDAO;
import daos.RespuestaDAO;
import daos.TematicaDAO;
import daosimpl.AlumnoDAOImplH;
import daosimpl.CursoDAOImplH;
import daosimpl.EvaluacionDAOImpIH;
import daosimpl.ExamenDAOImpIH;
import daosimpl.MatriculaDAOImplH;
import daosimpl.PeriodoDAOImplH;
import daosimpl.PermisoDAOImplH;
import daosimpl.PreguntaDAOImplH;
import daosimpl.PreguntaEstadoDAOImplH;
import daosimpl.ProfesorDAOImplH;
import daosimpl.RespuestaDAOImplH;
import daosimpl.TematicaDAOImplH;
import model.Alumno;
import model.CursoPeridoGrupo;
import model.Evaluacion;
import model.Examen;
import model.Matricula;
import model.PeriodoAcademico;
import model.Permiso;
import model.Pregunta;
import model.PreguntaEstado;
import model.Profesor;
import model.Curso;
import model.Respuesta;
import model.Tematica;

public class Principal {
	private static ProfesorDAO pDao = new ProfesorDAOImplH();
	private static CursoDAO cDao = new CursoDAOImplH();
	private static PreguntaEstadoDAO peDao = new PreguntaEstadoDAOImplH();
	private static PermisoDAO permisoDao = new PermisoDAOImplH();
	private static PreguntaDAO pregDao = new PreguntaDAOImplH();
	private static Profesor profesor = new Profesor();
	private static CursoPeridoGrupo cpg_seleccionado = new CursoPeridoGrupo();
	private static CursoPeriodoDAO cperDAO = new CursoPeriodoDAOImplH();
	private static TematicaDAO tDAO = new TematicaDAOImplH();
	private static EvaluacionDAO eva = new EvaluacionDAOImpIH();
	private static RespuestaDAO respDao = new RespuestaDAOImplH();
	private static String curso_grupo_actual = "";
	private static PeriodoDAO perDao = new PeriodoDAOImplH();
	private static Alumno alumno = new Alumno();
	private static AlumnoDAO alumDao = new AlumnoDAOImplH();
	private static CursoPeriodo cper=new CursoPeriodo();
	private static Evaluacion eva_examen=new Evaluacion();
	private static ExamenDAO examenDAO = new ExamenDAOImpIH();
	private static MatriculaDAO matriculaDAO = new MatriculaDAOImplH();
	private static int numpregunta=0;
	private static CursoPeridoGrupo selectedCursoPeriodoGrupo;
	public static Evaluacion ceexamen(String idgpc){
		   	
			return eva.ce_examen(idgpc); 
	   }
	
	public static Evaluacion getEva_examen() {
		return eva_examen;
	}

	public static void setEva_examen(Evaluacion eva_examen) {
		Principal.eva_examen = eva_examen;
	}

	public static Alumno getAlumno() {
		return alumno;
	}

	public static void setAlumno(Alumno alumno) {
		Principal.alumno = alumno;
	}

	public static PeriodoDAO getPerDao() {
		return perDao;
	}

	public static void setPerDao(PeriodoDAO perDao) {
		Principal.perDao = perDao;
	}

	public static CursoPeridoGrupo getCpg_seleccionado() {
		return cpg_seleccionado;
	}

	public static void setCpg_seleccionado(CursoPeridoGrupo cpg_seleccionado) {
		Principal.cpg_seleccionado = cpg_seleccionado;
	}
	
	public static CursoPeriodo getCp_coordinador() {
		return cper;
	}

	public static void setCp_coordinador(CursoPeriodo cp) {
		Principal.cper = cp;
	}

	public static void incio() {
		// HibernateUtil.iniciarSession();
	}

	public static void guardarPregunta(Pregunta pregunta) {
		pregDao.insertPregunta(pregunta);
	}

	public static void guardarRespuesta(Respuesta respuesta) {
		respDao.insertRespuesta(respuesta);
	}

	public static PreguntaEstado getEstadobyId(String id) {
		return peDao.FindById(id);
	}

	public static Pregunta ActualizarPregunta(String id, Respuesta respuesta) {
		return pregDao.updateByRespuesta(id, respuesta);
	}

	public static void consulta3(String campoconsulta) {
	}

	public static Profesor loginProfesor(Profesor p) {
		//HibernateUtil.iniciarSession();
		System.out.println(p.getDocenteId());
		System.out.println(p.getPassword());
		
		p = pDao.ValidarProfesor2(p);
		profesor = p;
		if(profesor!= null){
			cper=cursoxIdCoordinador(p.getDocenteId());	
		}	
		

		// HibernateUtil.cerrarSession();
		return p;

	}

	public static void main(String args[]) {
		loginProfesor(new Profesor());
	}

	public static List<Curso> listarCursosAll() {
		return cDao.ListarCursos();
	}

	public static Profesor getProfesor() {
		return profesor;
	}

	public static void setProfesor(Profesor profesor) {
		Principal.profesor = profesor;
	}

	public static List<?> listarAlumnosxProfesor(Profesor p){
		System.out.println("SESION DE MATRICULADOS DE UN PROFE");
		return matriculaDAO.ListarMatriculadosxProfesor(p);
	}
	
	public static List<Matricula> listarAlumnosxCPG(CursoPeridoGrupo cpg){
		System.out.println("SESION DE MATRICULADOS DE UN cPG");
		return matriculaDAO.ListarMatriculadosxCursoPeriodoGrupo(cpg);
	}
	
	public static List<Permiso> listarPermisosxProfesor(Profesor p) {
		// TODO Auto-generated method stub
		//HibernateUtil.iniciarSession();
		System.out.println("SESION DE PERMISOS DEL PROFE");
		return permisoDao.FindById(p);
	}

	public static List<Pregunta> listarPreguntasxCurso(Curso c) {
		// TODO Auto-generated method stub
		//HibernateUtil.iniciarSession();
		System.out.println("SESION DE PREGUNTAS POR CURSO");
		return pregDao.ListarPreguntasxCurso(c);
	}

	public static List<CursoPeriodo> listarCursosxPermisoProfesor(
			List<Permiso> per) {
		List<CursoPeriodo> cp = new ArrayList<CursoPeriodo>();
		for (int i = 0; i < per.size(); i++) {
			cp.add(per.get(i).getCursoPeriodo());
		}
		return cp;

	}

	public static Curso obtenerCurso(String id) {
		return cDao.FindById(id);
	}

	public static Tematica obtenerTematica(String id) {
		return tDAO.FindByID(id);
	}

	public static String generarIDPregunta() {
		List<Pregunta> pg = pregDao.ListarPreguntas();
		String result = pg.get(pg.size() - 1).getPreguntaId();

		if (pg.size() == 0) {
			return "T1";
		}

		int p = pg.size();
		p++;

		result = "T" + p;
		System.out.println("Preguntaid = " + result);

		return result;
	}
    public static String generarIDExamen(){
    	List<Examen> rp = examenDAO.ListarExamenes();
		if (rp.size() == 0) {
			return "E1";
		}

		int p = rp.size();
		p++;
		String result = "E" + p;
		System.out.println("Respuestaid = " + result);
		return result;	
    }
	public static String generarIDRespuesta() {
		List<Respuesta> rp = respDao.ListarRespuestas();
		if (rp.size() == 0) {
			return "R1";
		}

		int p = rp.size();
		p++;
		String result = "R" + p;
		System.out.println("Respuestaid = " + result);
		return result;
	}

	public static void grabaPermisos(Permiso perm) {
		permisoDao.insertarPermiso(perm);

	}

	public static int obtenerIdPermiso() {

		return permisoDao.obtenerId();
	}

	public static String getCurso_grupo_actual() {
		return curso_grupo_actual;
	}

	public static Evaluacion devolverCE(String id) {

		return eva.obtenerCE(id);

	}

	public static void modificarCE(Evaluacion p) {
		System.out.println("modifico" + "porfin");
		eva.update(p);
	}

	public static void setCurso_grupo_actual(String curso_grupo_actual) {
		Principal.curso_grupo_actual = curso_grupo_actual;
	}

	public static List<CursoPeriodo> listarCursosPeriodoAll() {
		// TODO Auto-generated method stub
		//HibernateUtil.iniciarSession();		
		return cperDAO.ListarCursos();
	}

	public static List<PeriodoAcademico> listarPeriodosAll() {
		System.out.println("SESION DE LISTA DE PERIODOS");
		return perDao.ListarPeriodos();
	}

	public static void guardarExamen(Examen e) {
		// HibernateUtil.iniciarSession();
		examenDAO.insertexamen(e);
	}

	public static List<Examen> listarExamenes(CursoPeridoGrupo cpg){
		List<Examen> aux= examenDAO.ListarExamenes();
		List<Evaluacion> aux2= eva.ListarEvaluaciones(cpg.getCursoPeridoGrupoId());
		List<Examen> result=new ArrayList<Examen>();
		for (int i = 0; i < aux.size(); i++) {
			for (int k = 0; k < aux2.size(); k++) {
				if(aux.get(i).getEvaluacion().getEvaluacionId().equalsIgnoreCase(aux2.get(k).getEvaluacionId())){
					result.add(aux.get(i));
				}
			}
			
		}
		return aux;
	}
	public static void guardarCE(Evaluacion e) {
		// HibernateUtil.iniciarSession();
		eva.insertCE(e);
	}

	public static CursoPeriodo obtenerCursoPeriodo(String curID) {
		// TODO Auto-generated method stub
		return cperDAO.FindById(curID);
	}

	public static Profesor obtenerProfesor(String profeID) {
		// TODO Auto-generated method stub
		System.out.println("OBTENER PROFESOR!! PRINCIPAL!!!");
		return pDao.FindById(profeID);
	}

	public static int obtenerIdConf() {
		// HibernateUtil.iniciarSession();
		return eva.obtenerId();
	}

	public static List<Evaluacion> devCE(String idgpc) {
		//HibernateUtil.iniciarSession();
		return eva.ListarEvaluaciones(idgpc);
	}

	public static List<Pregunta> listarPreguntasxPeriodo(PeriodoAcademico per,
			Curso c) {
		//HibernateUtil.iniciarSession();
		System.out.println("SESION DE PREGUNTAS POR PERIODO");
		return pregDao.ListarPreguntasxPeriodo(per, c);
	}

	public static List<Respuesta> listarRespuestasxPregunta(Pregunta p) {
		//HibernateUtil.iniciarSession();
		System.out.println("SESION DE RESPUESTAS POR PREGUNTA");
		return respDao.ListarRespuestasxPregunta(p);
	}
	public static PeriodoAcademico obtenerPeriodo(String periodoId) {
		return perDao.FindById(periodoId);
	}

	public static Alumno loginAlumno(Alumno alumnox) {
		// HibernateUtil.iniciarSession();
		System.out.println(alumnox.getAlumnoId());
		System.out.println(alumnox.getPassword());
		alumnox = alumDao.ValidarAlumno(alumnox);
		alumno = alumnox;
		// HibernateUtil.cerrarSession();
		return alumno;
	}

	public static List<Profesor> listarProfesoresAll() {
		// TODO Auto-generated method stub
		//HibernateUtil.iniciarSession();
		System.out.println("SESION DE LISTA DE PROFESORES!!!");
		return pDao.ListarProfesores();
	}
	public static CursoPeriodo cursoxIdCoordinador(String id){		
		return cperDAO.FindByCoordinadorId(id);
	}
	
	public static List<Pregunta> listarPreguntasPendientesxCurso(Curso curso){
		return pregDao.ListarPreguntasxEstadoxCurso(curso,"00004");
	}
	
	public static List<Pregunta> listarPreguntasxProfesor(Profesor p){
		return pregDao.ListarPreguntasxProfesor(p);
	}
	
	public static void modificaPregunta(Pregunta p){
		pregDao.updatePregunta(p);
	}

	public static List<Pregunta> randomPreguntas(Curso c, int cantidad) {
		List<Pregunta> result = pregDao.ListarPreguntasxCurso(c);
		List<Pregunta> resultado = new ArrayList<Pregunta>(); 
		for(int i=0;i<cantidad; i++){
			resultado.add(result.get((int)(Math.random()*(result.size()-1))));
		}
		return resultado;
	}

	public static int getNumpregunta() {
		return numpregunta;
	}

	public static void setNumpregunta(int numpregunta) {
		Principal.numpregunta = numpregunta;
	}
	
	public static void IniciarSesion(){
		HibernateUtil.iniciarSession();		
	}
	
    public static void CerrarSesion(){
    	alumno=new Alumno();
    	profesor= new Profesor();
		HibernateUtil.cerrarSession();
	}

	public static MatriculaDAO getMatriculaDAO() {
		return matriculaDAO;
	}

	public static void setMatriculaDAO(MatriculaDAO matriculaDAO) {
		Principal.matriculaDAO = matriculaDAO;
	}

	public static List<Examen> listarExamenesxAlumno(Alumno alu,CursoPeridoGrupo cpg) {
		List<Examen>aux= examenDAO.ListarExamenesxAlumno(alu);
		List<Examen> result=new ArrayList<Examen>();
		for (int i = 0; i < aux.size(); i++) {
			if(aux.get(i).getEvaluacion().getCursoPeridoGrupo().getCursoPeridoGrupoId().equalsIgnoreCase(cpg.getCursoPeridoGrupoId())){
				result.add(aux.get(i));
			}
		}
		return result;
	}
	

	public static int obtenerNumPregxProfesor(String codigo) {
		return pregDao.cantPregxProfesor(codigo);
	}
	
	public static int obtenerNumPregPendientesxProfesor(String codigo) {
		int a=pregDao.cantPregxProfesoxEstado(codigo,"00004");
		System.out.println("PENDIENTES: "+a);
		int b=pregDao.cantPregxProfesoxEstado(codigo,"00002");
		System.out.println("OBSEVADAS: "+b);
		int x1=a+b;
		return x1;
	}
	
	public static int obtenerNumPregAprobadasxProfesor(String codigo) {
		int c=pregDao.cantPregxProfesoxEstado(codigo,"00001");
		System.out.println("TOTAL PREGS: "+c);		
		return c;		
	}
	
	public static int obtenerNumExamxProfesor(String codigo){
		return  eva.obtenerCantEvalxProfesor(codigo);
		
	}
	 
}
